{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# インストラクションチューニングのためのデータセットを生成する\n",
    "\n",
    "このノートブックでは、インストラクションチューニングのためのデータセットを生成するプロセスを案内します。`distilabel`パッケージを使用してインストラクションチューニングのためのデータセットを生成します。\n",
    "\n",
    "それでは、インストラクションチューニングデータセットを見てみましょう。\n",
    "\n",
    "<div style='background-color: lightblue; padding: 10px; border-radius: 5px; margin-bottom: 20px; color:black'>\n",
    "    <h2 style='margin: 0;color:blue'>演習: インストラクションチューニングのためのデータセットを生成する</h2>\n",
    "    <p>インストラクションチューニングのためのデータセットを生成する方法を見たので、実際にインストラクションチューニングのためのデータセットを生成してみましょう。</p>\n",
    "    <p><b>難易度レベル</b></p>\n",
    "    <p>🐢 インストラクションチューニングデータセットを生成する</p>\n",
    "    <p>🐕 シードデータを使用してインストラクションチューニングのためのデータセットを生成する</p>\n",
    "    <p>🦁 シードデータとインストラクションの進化を使用してインストラクションチューニングのためのデータセットを生成する</p>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "vscode": {
     "languageId": "plaintext"
    }
   },
   "source": [
    "## 依存関係のインストール\n",
    "\n",
    "transformersの代わりに、`vllm`や`hf-inference-endpoints`をインストールすることもできます。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install \"distilabel[hf-transformers,outlines,instructor]\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 合成の開始\n",
    "\n",
    "前のコース内容で見たように、インストラクションデータセット生成のためのdistilabelパイプラインを作成できます。最低限のパイプラインはすでに提供されています。このパイプラインをスケールアップして、インストラクションチューニングのための大規模なデータセットを生成してください。モデル、モデルプロバイダー、生成引数を入れ替えて、データセットの品質にどのように影響するかを確認してください。小規模に実験し、後でスケールアップしましょう。\n",
    "\n",
    "[distilabelコンポーネントギャラリー](https://distilabel.argilla.io/latest/components-gallery/)で、処理クラスの情報とその使用方法を確認してください。\n",
    "\n",
    "辞書からデータをロードする代わりに、Hubからデータをロードする例を以下に示します。\n",
    "\n",
    "```python\n",
    "from datasets import load_dataset\n",
    "\n",
    "with Pipeline(...) as pipeline:\n",
    "    ...\n",
    "\n",
    "if __name__ == \"__main__:\n",
    "    dataset = load_dataset(\"my-dataset\", split=\"train\")\n",
    "    distiset = pipeline.run(dataset=dataset)\n",
    "```\n",
    "\n",
    "パイプラインを実行した後、データセットをHubにプッシュするのを忘れないでください！"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "from distilabel.llms import TransformersLLM\n",
    "from distilabel.pipeline import Pipeline\n",
    "from distilabel.steps import LoadDataFromDicts\n",
    "from distilabel.steps.tasks import TextGeneration\n",
    "\n",
    "with Pipeline() as pipeline:\n",
    "    data = LoadDataFromDicts(data=[{\"instruction\": \"Hugging Faceの小規模AIモデルに関するSmol-Courseについての短い質問を生成してください。\"}])\n",
    "    llm = TransformersLLM(model=\"HuggingFaceTB/SmolLM2-1.7B-Instruct\")\n",
    "    gen_a = TextGeneration(llm=llm, output_mappings={\"generation\": \"instruction\"})\n",
    "    gen_b = TextGeneration(llm=llm, output_mappings={\"generation\": \"response\"})\n",
    "    data >> gen_a >> gen_b\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "    distiset = pipeline.run(use_cache=False)\n",
    "    distiset.push_to_hub(\"huggingface-smol-course-instruction-tuning-dataset\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 🌯 まとめ\n",
    "\n",
    "インストラクションチューニングのためのデータセットを生成する方法を見てきました。これを使用して次のことができます：\n",
    "\n",
    "- インストラクションチューニングのためのデータセットを生成する。\n",
    "- インストラクションチューニングのための評価データセットを作成する。\n",
    "\n",
    "次に\n",
    "\n",
    "🧑‍🏫 学ぶ - [preference datasetsの生成](./preference_datasets.md)について学ぶ\n",
    "🏋️‍♂️ 合成データセットに基づいて[インストラクションチューニングの章](../../1_instruction_tuning/README.md)でモデルを微調整する\n"
   ]
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
